package ar.com.aterrizar.entidades;

import ar.com.aterrizar.estrategiasOrdenamiento.*;
import ar.com.aterrizar.filtrosBusqueda.*;
import ar.com.aterrizar.asientos.*;

import java.util.*;

import org.uqbar.commons.utils.Observable;

@Observable
public class Buscador {
	private Cliente cliente;
	private String origen;
	private String destino;
	private String fecha;
	private Filtro ultimoFiltro;
	private Ordenamiento ordenamiento;
	private Collection<TipoDeClaseAsiento> clasesFiltradas= new ArrayList<TipoDeClaseAsiento>();
	
	public Buscador(Cliente cliente){
		this.cliente = cliente;
	}
	
	public Buscador(Cliente cliente,String origen,String destino,String fecha){
		this.origen = origen;
		this.destino = destino;
		this.fecha=fecha;
		this.cliente = cliente;
		this.ultimoFiltro=new FiltroObligatorio(this.origen, this.destino, this.fecha, this.cliente);
		this.ordenamiento=new Ordenamiento();
	}
	
	
	public Ordenamiento getOrdenamiento(){
		return this.ordenamiento;
	}
	public void setOrdenamiento(Ordenamiento ordenamiento){
		this.ordenamiento = ordenamiento;
	}
	public void setUltimoFiltro(Filtro filtro){
		this.ultimoFiltro = filtro;
	}
	public Filtro getUltimoFiltro(){
		return this.ultimoFiltro;
	}
	public void addUbicacionFilter(TipoDeUbicacionAsiento ubicacion){
		setUltimoFiltro(new FiltroPorUbicacion(this.ultimoFiltro,ubicacion));
	}
	public void addPrecioFilter(Float precioMinimo, Float precioMaximo){
		setUltimoFiltro(new FiltroPorPrecio(this.ultimoFiltro,this.cliente,precioMinimo,precioMaximo));
	}
	public void addAsientosReservadosFilter(){
		setUltimoFiltro(new FiltroPorAsientosReservados(this.ultimoFiltro));
	}
	public void addClassToFilterClass(TipoDeClaseAsiento clase){
		clasesFiltradas.add(clase);
	}
	public void addClassFilter(){
		FiltroPorClase filtro =new FiltroPorClase(this.ultimoFiltro);
		for(TipoDeClaseAsiento clase:clasesFiltradas){
			filtro.addClase(clase);
		}
		setUltimoFiltro(filtro);
	}
	public Collection<Asiento> getAsientos(){
		//List<Asiento> asientos = Lists.newLinkedList(Aeropuerto.getInstance().getAsientos(this.origen,this.fecha));
		//LinkedList<Asiento> asientos = Lists.newLinkedList(Aeropuerto.getInstance().getAsientos(this.origen, this.fecha, this.destino));
		Collection<Asiento> asientos = Aeropuerto.getInstance().getAsientos(this.origen, this.fecha, this.destino);
		LinkedList<Asiento> asientos_filtrados=(LinkedList<Asiento>) ultimoFiltro.filtrar(asientos);
		Collections.sort(asientos_filtrados, this.ordenamiento);
		return asientos_filtrados;
	}
}
